麦田云盒 1S Pro 安装黑群晖

我之前一直在一台 N5105 的小主机上通过 PVE 来运行 Docker 和黑群晖,随着存储内容的增加,原本的单盘位显得捉襟见肘起来;在闲鱼闲逛之时,看到了一台叫做麦田云盒 1S Pro 的小主机,配置刚好满足了我的需求,遂入手之~

配置

这台机器入手时的配置如下:

  • J4125
  • 单条4G(D4 双内存插槽)
  • 双2.5G网口
  • 双3.5盘位
  • 256G nvme thinkplus m2 SSD
  • 板载 32G emmc
  • 被动散热
  • 后置 8025 3pin DC风扇,但风扇接口为 4pin,可以更换 4pin pwm 风扇
  • DC 供电,60W 群联外置电源

软件方面,这台机器是由万由代工,内置了万由的 U-NAS OS,我对它不感兴趣,直接安装了黑群晖。

这台机器后置了一个 8025 3pin arctic 风扇,噪音十分巨大,我换了一个利民 TL-B8 8025 风扇上去;更换风扇时需要将机器整个后挡板拆下来,否则风扇排线无法穿过。

将黑群晖引导写入板载 EMMC

现在黑群晖安装已经非常简单,按照 https://rrorg.cn/archives/Use%20guide 的指引,可以几乎做到一键安装。

这台机器内置了 32G EMMC ,我们可以将 RR 的引导写入该存储设备中,免去了使用 U 盘作为引导设备占用一个 USB 接口的问题。

要将引导写入 EMMC 中,可以先使用 U 盘进入 Linux Live 系统,使用 dd 命令将 RR 引导的 IMG 文件写入 EMMC 设备。命令如下:

# 请自行替换命令中引导文件和 EMMC 设备对应的路径
dd if=/rr.img of=/dev/mmcblk0 bs=4M

写入完成后,重启设备并拔掉 Linux Live 的 U 盘,开机后按照上述链接中的指引进行安装即可。

风扇自动调速

BIOS 本身不支持调速,只有通过机器内置的 U-NAS 才能实现调速。针对这个限制,网上早有前辈给出了解决方案:可以通过 i2cset 命令来设置风扇转速,实现调速功能。

由于群晖系统被阉割过,无法直接安装 i2cset 等命令,因此需要先安装 entware 这个软件仓库。

在群晖上安装 entware 可以参考官方教程:https://github.com/Entware/Entware/wiki/Install-on-Synology-NAS

entware 安装完成之后,可以通过以下命令来安装调速用到的软件包:

# sensor      这个程序用来读取 CPU 温度
# i2c-tools   这个程序用来设置风扇转速
opkg install lm-sensors i2c-tools

安装完成之后,我们便可以实现根据实时温度对风扇进行调速了。完整的脚本附在正文最后,有需要的朋友可以参考,具体思路如下:

  • 使用 smartctl 来读取两块硬盘的温度
  • 求出两块硬盘温度中的最高温度
  • 使用 sensors 得出 CPU 核心的温度
  • 求出硬盘和 CPU 之间的最高温度
  • 使用温度计算出风扇转速,范围为 0x00 ~ 0xFF,即最大值 255
    • 实际上设置的是 PWM 占空比,而不是风扇转速
  • 读取当前的风扇转速
  • 对比本次计算出的风扇转速和实际风扇转速差异值
  • 若差异值大于 10 时,调节风扇转速并写入缓存文件
    • 这一步是为了避免温度的细小波动使得风扇频繁调整转速
  • 在群晖的 WebUI 中添加以 root 身份运行的定时任务,每分钟执行一次
#!/bin/sh

# Hard disk temperature
disk_temp1=$(smartctl --all /dev/sda | grep Temperature_Celsius | awk '{print $10}')
disk_temp2=$(smartctl --all /dev/sdb | grep Temperature_Celsius | awk '{print $10}')
disk_temp1=${disk_temp1:-40}
disk_temp2=${disk_temp2:-40}
max_disk_temp=$(( disk_temp1 > disk_temp2 ? disk_temp1 : disk_temp2 ))

echo "Disk temperature: $max_disk_temp"

# CPU temperature
cpu_temp=$(sensors | grep 'Physical id 0' | awk '{printf "%d", $4}')
cpu_temp=${cpu_temp:-40}
echo "CPU temperature: $cpu_temp"

max_temp=$(( max_disk_temp > cpu_temp ? max_disk_temp : cpu_temp ))
echo "Max temperature: $max_temp"

get_fan_speed() {
	local temp=$1
	if (( temp < 40 )); then
			echo 80
	elif (( temp > 70 )); then
			echo 255
	else
			# 线性插值
			echo $(( (temp - 40) * (255 - 80) / (70 - 40) + 80 ))
	fi
}

fan_speed=$(get_fan_speed $max_temp)
echo "Fan speed: $fan_speed"

last_fan_speed_hex=$(i2cget -y 0 0x54 0xf0)
last_fan_speed=$(( last_fan_speed_hex ))
echo "Last fan speed: $last_fan_speed"
# diff between last and current fan speed
diff=$(( fan_speed > last_fan_speed ? fan_speed - last_fan_speed : last_fan_speed - fan_speed ))

if (( diff < 10 )); then
	echo "Diff is less than 10, do nothing"
else
	echo "Set fan speed to $fan_speed"
	i2cset -y 0 0x54 0xf0 $fan_speed
	echo "$(date '+%F %T') Temp=$max_temp Fan=$fan_speed Diff=$diff" >> /var/log/fan_control.log
fi

Powered By Hexo & Theme Veni